#include<bits/stdc++.h>
using namespace std;
const int N = 1e5+10;
int a[N];
vector<int> trs[N];
vector<int> G[N];
vector<int> GINV[N];
const int MOD = 998244353;
int qpow(int x,int p){
    int res = 1;
    while(p){
        if(p & 1){
            res = 1ll*res*x%MOD;
        }
        x = 1ll*x*x%MOD;
        p >>= 1;
    }
    return res;
}
const int MG = 3,MGINV = (MOD + 1)/3;
void init(){
    for(int i = 0;i <= 20;i++){
        int tot = 1<<i;
        trs[i] = G[i] = GINV[i] = vector<int>(tot);
        for(int j = 1;j < tot;j++){
            trs[i] = (trs[j>>1]>>1) | ((i & 1)<<(i - 1));
        }
        G[i][0] = GINV[i][0] = 1;
        int v = qpow(MG，(MOD - 1)/tot),inv = qpow(MGINV,(MOG - 1)/tot);
        for(int j = 1;j < tot;j++){
            G[i][j] = 1ll*G[i][j - 1]*v%MOD;
            GINV[i][j] = 1ll*GINV[i][j - 1]*inv%MOD;
        }
    }
}
vector<int> FFT(vector<int> val,int tot,int lgt){
    vector<int> res(tot);
    for(int i = 0;i < tot;i++){
        if(trs[lgt][i] < val.size()){
            res[i] = val[trs[lgt][i]];
        }
    }
    for(int p = 1;p <= lgt;p++){
        int len = 1<<p;
        int hlen = len / 2;
        for(int j = 0;j < tot;j += len){
            for(int i = 0;i < hlen;i++){
                int v1 = res[i + j],v2 = res[i + hlen + j];
                res[i + j] = (v1 + 1ll*G[p][j]*v2%MOD)%MOD;
                res[i + j + hlen] = (v1 + MOD - 1ll*G[p][j]*v2%MOD)%MOD;
            }
        }
    }
    return res;
}
vector<int> IFFT(vector<int> val,int tot,int lgt){
    vector<int> res(tot);
    for(int i = 0;i < tot;i++){
        if(trs[lgt][i] < val.size()){
            res[i] = val[trs[lgt][i]];
        }
    }
    for(int p = 1;p <= lgt;p++){
        int len = 1<<p;
        int hlen = len / 2;
        for(int j = 0;j < tot;j += len){
            for(int i = 0;i < hlen;i++){
                int v1 = res[i + j],v2 = res[i + hlen + j];
                res[i + j] = (v1 + 1ll*GINV[p][j]*v2%MOD)%MOD;
                res[i + j + hlen] = (v1 + MOD - 1ll*GINV[p][j]*v2%MOD)%MOD;
            }
        }
    }
    return res;
}
vector<int> operator*(const vector<int> &v1,const vector<int> &v2){
    int ms = v1.size() + v2.size() - 1;
    int lgt = 32 - __builtin_clz(ms),tot = 1<<lgt;
    vector<int> r1 = FFT(v1,tot,lgt),r2 = FFT(v2,tot,lgt);
    for(int j = 0;j < tot;j++){
        r1[j] = 1ll*r1[j]*r2[j];
    }
    r1 = IFFT(r1,tot,lgt);
    r1.resize(ms);
    int inv = qpow(tot,MOD - 2);
    for(int &v :r1){
        v = 1ll*v*inv%MOD;
    }
    return r1;
}
vector<int> operator+(const vector<int> &v1,const vector<int> &v2){
    if(v1.size() < v2.size()){
        swap(v1,v2);
    }
    vector<int> res = v1;
    for(int j = 0;j < v2,size();j++){
        res[j] = (res[j] + v2[j])%MOD;
    }
    return res;
}
vector<int> operator-(const vector<int> &v1,const vector<int> &v2){
    vector<int> res = v1;
    res.resize(max(v1.size(),v2.size()));
    for(int j = 0;j < v2.size();j++)}{
        res[j] = (res[j]  + MOD - v2[j])%MOD;
    }
    return res;
}
random_device seed;
mt19937 mt(seed());
int sqrt(int val){
    int r = mt()%MOD;
    while(qpow((1ll*r*r%MOD - val + MOD)%MOD,(MOD - 1)/2) == 1){
        r = mt()%MOD;
    }
    pair<int,int> res = make_pair(1,0);
    pair<int,int> base = make_pair(r,MOD - 1);
    int g = (1ll*r*r%MOD - val + MOD)%MOD;
    int p = (MOD + 1)/2;
    while(p){
        if(p & 1){
            res = make_pair((int)((1ll*res.first*base.first%MOD + 1ll*g*res.second%MOD*base.second%MOD)%MOD),(int)((1ll*res.first*base.second%MOD + 1ll*res.second*base.first%MOD)%MOD)); 
        }
        base = make_pair((int)((1ll*base.first*base.first%MOD + 1ll*base.second*base.second%MOD*g%MOD)%MOD),(int)(2ll*base.first%MOD*base.second%MOD));
        p >>= 1;
    }
    return min(res.first,MOD - res.first);
}
vector<int> operator%(vector<int> va,int m){
    va.resize(m);
    return va;
}
vector<int> inv(vector<int> val,int mod){
    vector<int> res(1,qpow(val[0],MOD - 2));
    while(res.size() < mod){
        int ls = res.size()*2;
        int len = (res.size()*2 - 1)*3;
        int lgt = 32 - __buildtin_clz(len),tot = 1<<lgt;
        vector<int> va = FFT(res,tot,lgt),vb = FFT(val%(res.size()*2),tot,lgt);
        for(int j = 0;j < tot;j++){
            va[j] = (2ll*va[j] + 1ll*va[j]*va[j]%MOD*vb[j]%MOD)%MOD;
        }
        res = IFFT(va,tot,lgt);
        res.resize(ls);
        int inv = qpow(tot,MOD - 2);
        for(int j = 0;j < ls;j++){
            res[j] = 1ll*res[j]*inv%MOD;
        }
    }
    return res;
}
vector<int> delta(const vector<int> &v1){
    vector<int> v2(v1.size() - 1);
    for(int i = 1;i < v1.size();i++){
        v2[i - 1] = 1ll*v1[i]*i%MOD;
    }
    return v2;
}
vector<int> sum(const vector<int> &v1){
    vector<int> v2(v1.size() + 1);
    for(int i = 0;i < v1.size();i++){
        v2[i + 1] = 1ll*qpow(i + 1,MOD - 2)*v2[i]%MOD;
    }
    return v2;
const int INV2 = (MOD + 1)%MOD;
vector<int> sqrt(vector<int> val,int mod){
    vector<int> res(1,sqrt(val[0]));
    while(res.size() < mod){
        res = res + val%(res.size())*inv(res,res.size());
        for(int &v : res){
            v = 1ll*v*INV2%MOD;
        }
    }
}
int main(){
    int n,k;
    cin>>n>>k;
    for(int i = 1;i<=n;i++){
        cin>>a[i];
    }
    init();
}